# 作业：
# 1、有这样的一个列表，深度不可知，列表里面还会嵌套列表，
# 我想要把这个列表从左到右拼接成一个新的列表，且顺序不变
# 举例：
list1 = [12,33,[11,22,33,[55,66,99]],[55,66]]
# 变成：[12, 33, 11, 22, 33, 55, 66, 99, 55, 66]
def relist(list_obj:list)->list:
    result = []     # 定义一个空的列表
    for i in list_obj:      # 遍历要处理的列表
        if isinstance(i,list):  # 判断类型是不是列表，如果是列表
            result.extend(relist(i))        # 自己调用自己，用extend方法给它加进去
        else:
            result.append(i)            # 直接在末尾追加一个
    return result       # 最终返回result列表的结果

# print(relist(list1))

# 2、编写装饰器，为多个函数加上认证的功能（用户的账号密码）
#  要求登录成功一次，后续的函数都无需输入用户名和密码
target = False      # 定义一个目标值
def login(func):
    def luoji(*args,**kwargs):
        global target       # 引用全局变量
        if target:   # 如果说这个目标值变成了True
            print("免登录")
            func(*args,**kwargs)
        else:
            user = input("请输入账号：")
            password = input("请输入密码：")
            if user == 'admin' and password =='123456':
                print("登录成功！")
                func(*args,**kwargs)
                target = True       # 目标值修改为True
            else:
                print("登录失败！")
    return luoji
@login
def shopping():
    print("购物，买买买")
@login
def eat():
    print("吃饭，吃吃吃")

# shopping()
# eat()



"""
装饰器样例：
def xxx(func):
    def xx1(*args,**kwargs):
        新的功能增加
        func(*args,**kwargs)
        新的功能增加
    return xx1
"""






# 3、请实现一个装饰器，把函数的返回值+100然后返回
def addNum(func):       # func是要修饰的方法形参
    def luoji(*args,**kwargs):
        n = func(*args,**kwargs)      # 调用老方法
        # 用返回值+100
        n +=100
        return n
    return luoji

@addNum
def num():
    return 1

# print(num())        # 101


# 写一个装饰器，要给任何函数增加自我介绍的功能
def info(func):
    def luoji(*args,**kwargs):
        func(*args,**kwargs)
        name = input("请输入你的姓名：")
        age = input("请输入你的年龄：")
        address = input("请输入你的地址：")
        print(f"大家好，我叫做：{name}，今年：{age}岁，来自：{address}")
    return luoji

@info
def sss(play):
    print("开始玩:%s"%play)

# sss("足球")
"""
print("开始玩:%s"%play)
name = input("请输入你的姓名：")
age = input("请输入你的年龄：")
address = input("请输入你的地址：")
print(f"大家好，我叫做：{name}，今年：{age}岁，来自：{address}")
"""



# 4、请实现一个装饰器，通过一次调用使函数重复执行指定次数
def count(func):
    def luoji(counts,*args,**kwargs):
        for i in range(counts):
            func(counts,*args,**kwargs)
    return luoji
@count
def eat1(counts):
    print("重复执行%s次"%counts)
    print("吃吃吃")

eat1(10)








# 5、输入任意个字符串,分别实现从小到大输出和从大到小输出
# 6、接收n个数字，求这些参数数字的和
# 7、编写一个函数，实现数字的自增（从0开始，每调用一次，数字+1）